//package cn.wu.jishupeizhi.elasticsearch;
//
//import org.elasticsearch.action.admin.indices.create.CreateIndexRequest;
//import org.elasticsearch.client.RequestOptions;
//import org.elasticsearch.common.xcontent.XContentType;
//import org.elasticsearch.index.query.QueryBuilders;
//import org.elasticsearch.search.aggregations.AggregationBuilder;
//import org.elasticsearch.search.aggregations.AggregationBuilders;
//import org.elasticsearch.search.aggregations.Aggregations;
//import org.elasticsearch.search.aggregations.BucketOrder;
//import org.elasticsearch.search.aggregations.bucket.terms.Terms;
//import org.junit.jupiter.api.Test;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.boot.test.context.SpringBootTest;
//import org.springframework.data.domain.Sort;
//import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
//import org.springframework.data.elasticsearch.core.SearchHit;
//import org.springframework.data.elasticsearch.core.SearchHits;
//import org.springframework.data.elasticsearch.core.geo.GeoPoint;
//import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates;
//import org.springframework.data.elasticsearch.core.query.*;
//import org.springframework.data.elasticsearch.core.query.UpdateQuery;
//import org.springframework.data.elasticsearch.core.query.UpdateResponse;
//import org.springframework.data.domain.PageRequest;
//import java.io.IOException;
//import java.util.ArrayList;
//import java.util.List;
//
//@SpringBootTest
//public class ElaticsearchT {
//
//    @Autowired
//    private ElasticsearchRestTemplate elasticsearchRestTemplate;
//
//    private final String INDEX_NAME = "hotel";
//
//
//    /** 插入文档
//     * 如果没有创建索引，在提交文档时会自动创建索引，
//     */
//    @Test
//    public void testSaveHotel() {
//        Hotel hotel = new Hotel();
//        hotel.setId("3");
//        hotel.setName("好运来酒店");
//        hotel.setPrice(81);
//        hotel.setScore(41);
//        hotel.setCity("深圳");
//        hotel.setBrand("好运来");
//        hotel.setStarName("二星级");
//        hotel.setLocation(new GeoPoint(39.9042, 116.4074));
//        elasticsearchRestTemplate.save(hotel);
//    }
//
//    /**
//     * 批量插入文档
//     */
//    @Test
//    public void testBatchSave() {
//        Hotel hotel1 = new Hotel();
//        hotel1.setId("5");
//        hotel1.setName("如家民宿");
//        hotel1.setPrice(200);
//        hotel1.setScore(45);
//        hotel1.setCity("深圳");
//        hotel1.setBrand("如家");
//        hotel1.setStarName("三星级");
//        hotel1.setLocation(new GeoPoint(39.9042, 116.4074));
//
//        Hotel hotel2 = new Hotel();
//        hotel2.setId("6");
//        hotel2.setName("汉庭民宿");
//        hotel2.setPrice(180);
//        hotel2.setScore(42);
//        hotel2.setCity("上海");
//        hotel2.setBrand("汉庭");
//        hotel2.setStarName("三星级");
//        hotel2.setLocation(new GeoPoint(31.2304, 121.4737));
//
//        List<Hotel> hotels = new ArrayList<>();
//        hotels.add(hotel1);
//        hotels.add(hotel2);
//        for(Hotel hotel : hotels){
//            elasticsearchRestTemplate.save(hotel);
//        }
//    }
//
//    /**根据ID查询
//     */
//    @Test
//    public void testGetById() {
//        String id = "3";
//        Hotel hotel = elasticsearchRestTemplate.get(id, Hotel.class);
//        System.out.println("Retrieved document: " + hotel.toString());
//    }
//
//
//    /** 根据ID删除
//     */
//    @Test
//    public void testDeleteById() {
//        String id = "1";
//        String deletedId = elasticsearchRestTemplate.delete(id, Hotel.class);
//        System.out.println("Deleted document with id: " + deletedId);
//    }
//
//    /** 更新文档
//     * 如果存在不存在修改文档，就创建文档，如果存在文档就修改
//     */
//    @Test
//    public void updateHotel() {
//        Hotel hotel = new Hotel();
//        hotel.setId("1"); // 必须设置ID
//        hotel.setName("永辉酒店");
//        hotel.setPrice(150);
//        hotel.setScore(440);
//        hotel.setCity("广州");
//        hotel.setBrand("永辉");
//        hotel.setStarName("二星级");
//        hotel.setLocation(new GeoPoint(23.1291, 113.2644));
//        elasticsearchRestTemplate.save(hotel);
//    }
//
//    /** 条件查询
//     * 创建查询条件，并执行查询
//     */
//    @Test
//    public void selectEs() {
//        // 创建查询条件
//        Criteria criteria = new Criteria("city").is("深圳")
//                .and("price").lessThan(100);
//
//        // 创建查询
//        Query query = new CriteriaQuery(criteria);
//
//        // 执行查询
//        SearchHits<Hotel> searchHits = elasticsearchRestTemplate.search(query, Hotel.class);
//
//        // 处理结果
//        for (SearchHit<Hotel> hit : searchHits) {
//            Hotel hotel = hit.getContent();
//            System.out.println(hotel);
//        }
//    }
//
//    /** 分页查询
//     * 分页查询
//     */
//    @Test
//    public void testPageQuery() {
//        // 创建查询条件
//        Criteria criteria = new Criteria("city").is("深圳");
//
//        // 创建分页查询
//        Query query = new CriteriaQuery(criteria)
//                .setPageable(PageRequest.of(0, 10));
//
//        // 执行查询
//        SearchHits<Hotel> searchHits = elasticsearchRestTemplate.search(query, Hotel.class);
//
//        // 处理结果
//        for (SearchHit<Hotel> hit : searchHits) {
//            Hotel hotel = hit.getContent();
//            System.out.println(hotel);
//        }
//    }
//
//    /** 范围查询
//     *
//     */
//    @Test
//    public void testRangeQuery() {
//        // 创建范围查询条件
//        Criteria criteria = new Criteria("price")
//                .greaterThan(100)
//                .lessThan(200);
//
//        Query query = new CriteriaQuery(criteria);
//        SearchHits<Hotel> searchHits = elasticsearchRestTemplate.search(query, Hotel.class);
//
//        for (SearchHit<Hotel> hit : searchHits) {
//            Hotel hotel = hit.getContent();
//            System.out.println(hotel);
//        }
//    }
//
//    /**模糊查询
//     * 测试模糊查询功能。
//     * 该函数用于验证在Elasticsearch中执行模糊查询的正确性。
//     * 通过创建一个模糊查询条件，查询包含指定关键词的酒店信息，并输出查询结果。
//     */
//    @Test
//    public void testFuzzyQuery() {
//        // 创建模糊查询条件，指定字段为"name"，模糊查询关键词为"如家"
//        Criteria criteria = new Criteria("name")
//                .fuzzy("如家");
//
//        // 将查询条件封装为Query对象
//        Query query = new CriteriaQuery(criteria);
//
//        // 执行查询，获取匹配的酒店信息
//        SearchHits<Hotel> searchHits = elasticsearchRestTemplate.search(query, Hotel.class);
//
//        // 遍历查询结果，输出每个酒店的详细信息
//        for (SearchHit<Hotel> hit : searchHits) {
//            Hotel hotel = hit.getContent();
//            System.out.println(hotel);
//        }
//    }
//
//    // 排序查询
//    @Test
//    public void testSortQuery() {
//        Criteria criteria = new Criteria("city").is("深圳");
//
//        Query query = new CriteriaQuery(criteria)
//                .addSort(Sort.by(Sort.Direction.DESC, "price"));
//
//        SearchHits<Hotel> searchHits = elasticsearchRestTemplate.search(query, Hotel.class);
//
//        for (SearchHit<Hotel> hit : searchHits) {
//            Hotel hotel = hit.getContent();
//            System.out.println(hotel);
//        }
//    }
//
//    // 聚合查询
//    @Test
//    public void testAggregationQuery() {
//        // 1. 构建聚合查询
//        NativeSearchQuery query = new NativeSearchQueryBuilder()
//                .withQuery(QueryBuilders.matchAllQuery()) // 匹配所有文档
//                .addAggregation(AggregationBuilders.terms("city_agg") // 定义terms聚合
//                        .field("city") // 按city字段分组
//                        .size(10) // 设置返回的桶数量（默认为10）
//                        .order(BucketOrder.count(false)) // 按文档数量降序排序
//                )
//                .withPageable(PageRequest.of(1, 10)) // 设置size为0，不返回具体文档
//                .build();
//
//        // 2. 执行查询
//        SearchHits<Hotel> searchHits = elasticsearchRestTemplate.search(query, Hotel.class);
//
//        // 3. 处理聚合结果
//        Aggregations aggregations = searchHits.getAggregations();
//        if (aggregations != null) {
//            Terms cityAgg = aggregations.get("city_agg");
//            if (cityAgg != null) {
//                for (Terms.Bucket bucket : cityAgg.getBuckets()) {
//                    String city = bucket.getKeyAsString();
//                    long docCount = bucket.getDocCount();
//                    System.out.println("城市: " + city + "，文档数量: " + docCount);
//                }
//            } else {
//                System.out.println("未找到聚合结果");
//            }
//        } else {
//            System.out.println("聚合结果为空");
//        }
//    }
//
//    @Test
//    public void testSelectW() {
//        Criteria criteria = new Criteria("city").is("深圳")
//                .and("price").lessThan(200)
//                .and("score").lessThan(43);
////                .and("name").fuzzy("酒店");
//        Query query = new CriteriaQuery(criteria);
//        SearchHits<Hotel> searchHits = elasticsearchRestTemplate.search(query, Hotel.class);
//        for (SearchHit<Hotel> hit : searchHits) {
//            Hotel hotel = hit.getContent();
//            System.out.println(hotel);
//        }
//
//    }
//
//}
